// src/main/services/path-service.ts
import path from 'path';
import { app, ipcMain } from 'electron';
import fs from 'fs';
import Logger from 'electron-log';


export class PathService {
  private readonly _isPackaged: boolean;

  constructor() {
    this._isPackaged = app.isPackaged;
  }

  /**
   * 获取应用基础路径（不暴露给外部）
   */
  private get _appBasePath(): string {
    return this._isPackaged
      ? path.dirname(app.getPath('exe'))  // 生产环境：exe所在目录
      : path.join(__dirname, '../..');    // 开发环境：项目根目录
  }

  /**
   * 获取资源根目录（生产环境指向app.asar内部的resources）
   */
  public get resourcesRoot(): string {
    return this._isPackaged
      ? path.join(process.resourcesPath, "/") // 生产环境直接使用asar内资源
      : path.join(this._appBasePath, 'resources'); // 开发环境保持原样
  }

  /**
   * 安全获取ASAR内资源路径（不进行任何解压操作）
   */
  public getAsarResource(relativePath: string): string {
    const fullPath = path.join(this.resourcesRoot, relativePath);

    // 生产环境强制验证路径是否在app.asar内
    if (this._isPackaged) {
      const normalizedPath = fullPath.replace(/\\/g, '/');
      if (!normalizedPath.includes('app.asar')) {
        throw new Error(`[Security] 禁止访问app.asar外部资源: ${fullPath}`);
      }
    }

    // 开发环境检查文件是否存在
    if (!this._isPackaged && !fs.existsSync(fullPath)) {
      throw new Error(`资源文件不存在: ${fullPath}`);
    }

    return fullPath;
  }

  /**
   * 获取ADB工具路径（自动处理平台差异）
   */
  public get adbPath(): string {
    const binaryName = process.platform === 'win32' ? 'adb.exe' : 'adb';
    return this.getAsarResource(path.join('bin', binaryName));
  }

  /**
   * 获取Python脚本路径
   */
  public get pythonScriptPath(): string {
    return this.getAsarResource('scripts/main.py');
  }

  /**
   * 获取用户数据目录（完全独立于app.asar）
   */
  public get userDataPath(): string {
    const dir = app.getPath('userData');
    this._ensureDirExists(dir);
    return dir;
  }

  /**
   * 内部方法：确保目录存在
   */
  private _ensureDirExists(dirPath: string): void {
    if (!fs.existsSync(dirPath)) {
      fs.mkdirSync(dirPath, { recursive: true });
    }
  }
}


// 保持原有的IPC注册逻辑不变
export function registerPathIPC(service: PathService) {
  ipcMain.handle('path:getAdbPath', () => service.adbPath);
  ipcMain.handle('path:getPythonScriptPath', () => service.pythonScriptPath);
  ipcMain.handle('path:getResourcesPath', () => service.resourcesRoot);
  ipcMain.handle('path:getUserDataPath', () => service.userDataPath);
}

// 保持原有的单例导出方式不变
export const pathService = new PathService();
